

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Singularity安全性 &mdash; Singularity container 3.5 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.png"/>
  
  
  

  
  <script type="text/javascript" src="_static/js/modernizr.min.js"></script>
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
        <script src="_static/jquery.js"></script>
        <script src="_static/underscore.js"></script>
        <script src="_static/doctools.js"></script>
        <script src="_static/language_data.js"></script>
        <script src="_static/js/ga.js"></script>
    
    <script type="text/javascript" src="_static/js/theme.js"></script>

    

  
  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Build容器" href="build_a_container.html" />
    <link rel="prev" title="入门教程" href="quick_start.html" /> 
</head>

<body class="wy-body-for-nav">

   
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >
          

          
            <a href="index.html" class="icon icon-home"> Singularity container
          

          
            
            <img src="_static/logo.png" class="logo" alt="Logo"/>
          
          </a>

          
            
            
              <div class="version">
                3.5
              </div>
            
          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="introduction.html">介绍</a></li>
<li class="toctree-l1"><a class="reference internal" href="quick_start.html">快速入门</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Singularity安全</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id1">安全策略</a></li>
<li class="toctree-l2"><a class="reference internal" href="#singularity-pro">Singularity PRO - 长期支持 &amp; 安全补丁</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id2">Singularity 运行时 &amp; 用户特权</a></li>
<li class="toctree-l2"><a class="reference internal" href="#singularity-image-format-sif">Singularity Image Format (SIF)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">管理员可配置文件</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#cgroups">cgroups的支持</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id4"><code class="docutils literal notranslate"><span class="pre">--security</span></code> 选项</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#sylabs-cloud">Sylabs Cloud的安全性</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#remote-builder">Remote Builder</a></li>
<li class="toctree-l3"><a class="reference internal" href="#container-library">Container Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="#key-store">Key Store</a></li>
<li class="toctree-l3"><a class="reference internal" href="#authenticationencryption">Authentication和encryption</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="build_a_container.html">Build容器</a></li>
<li class="toctree-l1"><a class="reference internal" href="definition_files.html">Definition文件</a></li>
<li class="toctree-l1"><a class="reference internal" href="build_env.html">Build环境</a></li>
<li class="toctree-l1"><a class="reference internal" href="singularity_and_docker.html">Singularity和Docker</a></li>
<li class="toctree-l1"><a class="reference internal" href="fakeroot.html">Fakeroot</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="signNverify.html">签名和认证</a></li>
<li class="toctree-l1"><a class="reference internal" href="key_commands.html">Key管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="encryption.html">容器加密</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="endpoint.html">容器仓库</a></li>
<li class="toctree-l1"><a class="reference internal" href="cloud_library.html">Cloud Library</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="bind_paths_and_mounts.html">路径映射</a></li>
<li class="toctree-l1"><a class="reference internal" href="persistent_overlays.html">持久化Overlay</a></li>
<li class="toctree-l1"><a class="reference internal" href="running_services.html">运行服务</a></li>
<li class="toctree-l1"><a class="reference internal" href="environment_and_metadata.html">环境变量和元数据</a></li>
<li class="toctree-l1"><a class="reference internal" href="oci_runtime.html">OCI运行时</a></li>
<li class="toctree-l1"><a class="reference internal" href="plugins.html">插件</a></li>
<li class="toctree-l1"><a class="reference internal" href="security_options.html">安全选项</a></li>
<li class="toctree-l1"><a class="reference internal" href="networking.html">网络选项</a></li>
<li class="toctree-l1"><a class="reference internal" href="cgroups.html">Cgroups</a></li>
<li class="toctree-l1"><a class="reference internal" href="mpi.html">MPI应用</a></li>
<li class="toctree-l1"><a class="reference internal" href="gpu.html">GPU支持</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="contributing.html">Contributing</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="appendix.html">Appendix</a></li>
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command Line Reference</a></li>
</ul>

            
          
        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="index.html">Singularity container</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content style-external-links">
        
          















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="wy-breadcrumbs">
    
      <li><a href="index.html">Docs</a> &raquo;</li>
        
      <li>Singularity安全性</li>
    
    
      <li class="wy-breadcrumbs-aside">
        
            
            
              <a href="https://github.com/sylabs/singularity-userdocs/blob/master/security.rst" class="fa fa-github"> Edit on GitHub</a>
            
          
        
      </li>
    
  </ul>

  
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="section" id="singularity">
<span id="security"></span><h1>Singularity安全性<a class="headerlink" href="#singularity" title="Permalink to this headline">¶</a></h1>
<p>容器非常流行，相比较VM。它轻量，便捷，极大的减轻了IT资源管理的工作量。
更重要的是，容器将软件和其各种依赖打包后方便共享和重复生成。
但是容器也面临一些安全性的挑战。</p>
<p>Singularity满足了容器的一些主要使命：方便共享，重复生成，HPC运行支持，和安全。
这一章节将描述Singularity支持的安全相关的特性，特别是和其它容器运行时的对比。</p>
<div class="section" id="id1">
<h2>安全策略<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<p>安全不是一个可选可不选的选项。保证安全需要在软件架构的一开始就考虑，并不断改进。
除了要保证容器运行时不要有提权的漏洞外，还要保证容器是基于可信的用户和代码生成，
同时用户需要实时监控是不是有新的安全漏洞被公布，需要及时更新软件来fix安全漏洞。
Sylabs会持续的发现安全漏洞并通过补丁修复这些漏洞。</p>
<p>如果你发现了Singularity的一个安全漏洞，你可以参照 <a class="reference external" href="https://sylabs.io/security-policy">Security Policy</a> 提交漏洞。以便这个漏洞可以被公开，被研究和修复这个漏洞。</p>
</div>
<div class="section" id="singularity-pro">
<h2>Singularity PRO - 长期支持 &amp; 安全补丁<a class="headerlink" href="#singularity-pro" title="Permalink to this headline">¶</a></h2>
<p>安全补丁也会加入到Singularity的开源版本中，所以使用最新的release是非常有必要的。</p>
<p>SingularityPRO是一个专业版，具有license的授权，相比开源版本提供更多安全，稳定性的支持。
最新版本中修复的安全漏洞和bug，也会在老的PRO版本中支持，这样PRO版本可以提供长期的支持。
PRO版本的用户会在开源版本发布前先收到安全的补丁 <a class="reference external" href="https://sylabs.io/security-policy">Sylabs Security Policy</a>。</p>
</div>
<div class="section" id="id2">
<h2>Singularity 运行时 &amp; 用户特权<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
<p>Singularity运行时能保证在一个多租户的资源环境上，多个不被信任的用户运行不被信任的容器但不会对资源环境造成破坏和影响。
这是因为，当运行一个容器时，容器内的用户和host上的用户是同一个用户，
singularity动态的将UID和GID信息加入容器文件中，这样就保证容器内和容器外的用户是同一用户。
比如，如果你在容器外是一个普通用户，你在进入容器后还是普通用户。</p>
<p>另外一块是防止用户在容器内部提升权限，容器文件系统以 <code class="docutils literal notranslate"><span class="pre">nosuid</span></code> 选项mounted，
容器内进程以 <code class="docutils literal notranslate"><span class="pre">PR_NO_NEW_PRIVS</span></code> 标记开始。 这意味着，你在容器内运行 <code class="docutils literal notranslate"><span class="pre">sudo</span></code> 也不能su成其他用户，
或者获取root的权限。这种方式提供了运行容器的安全的方法，也极大的简化了读写host上数据。</p>
<p>另外重要的是Singularity的设计哲学是 <em>Integration</em> 而不是 <em>Isolation</em>。
其它大多数的容器运行时追求尽可能多的隔离容器和host环境。
而Singularity认为用户的首要目标是打包共享，重复生成和易用，隔离只是第三位的考虑因素。
因此, 默认情况下Singularity只隔离mount的namespace，会将host上的 <code class="docutils literal notranslate"><span class="pre">$HOME</span></code> 和  <code class="docutils literal notranslate"><span class="pre">/tmp</span></code> 映射到容器中。
当然，如果需要，通过命令选项，singularity也支持更多层次的隔离。</p>
</div>
<div class="section" id="singularity-image-format-sif">
<h2>Singularity Image Format (SIF)<a class="headerlink" href="#singularity-image-format-sif" title="Permalink to this headline">¶</a></h2>
<p>保证容器安全是一个持续性的过程。SIF文件格式，至少能保证容器在传输和运行过程的一致性。</p>
<p>Singularity将容器打成一个只读的SIF文件。由于SIF文件是只读的，
并且支持容器签名，签名的内容也会被打到容器中，因此可以保证容器不被修改，并且可以知道谁签名的容器。
容器签名按照 <a class="reference external" href="https://www.openpgp.org/">OpenPGP</a> 的标准创建和管理这些签名，以及前面使用的key。
Build容器以后，可以使用 <code class="docutils literal notranslate"><span class="pre">singularity</span> <span class="pre">sign</span></code> 签名容器，
然后将容器和公共的PGP key (存储在 <a class="reference internal" href="#keystore"><span class="std std-ref">Keystore</span></a>)发布到Library。
用户可以使用 <code class="docutils literal notranslate"><span class="pre">singularity</span> <span class="pre">verify</span></code> 开验证签名。
<a class="reference internal" href="signNverify.html#signnverify"><span class="std std-ref">这个功能</span></a> 是不同团队之间的合作变得更容易。</p>
<p>Singularity从3.4开始, 支持加密容器的root文件系统(存储在SIF文件的squashFS部分)。
这样的话，没有正确的密码或者key的情况下，容器中的内容不可访问。
一个共享资源系统下的其它用户就算能看到容器文件，也不看到其里面的内容。</p>
<p>其它的容器平台，在容器运行的时候，需要将多个layer的内容提取到host上的rootfs目录下。
而Singularity只需要一步，直接从一个只读的SIF文件获取内容。这个减少了layer层的安全攻击。</p>
</div>
<div class="section" id="id3">
<h2>管理员可配置文件<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2>
<p>Singularity的系统管理员可以使用配置文件设置安全限制，赋予或者撤销用户的capabilities，管理资源和授权容器等。</p>
<p>比如, 使用文件 <a class="reference external" href="https://sylabs.io/guides/3.5/admin-guide/configfiles.html#ecl-toml">ecl.toml</a> 可以设置容器的白名单和黑名单。</p>
<p><a class="reference external" href="https://sylabs.io/guides/3.5/admin-guide/configfiles.html">管理员的文档</a> 讲解了配置文件和里面的参数的定义。</p>
<div class="section" id="cgroups">
<h3>cgroups的支持<a class="headerlink" href="#cgroups" title="Permalink to this headline">¶</a></h3>
<p>从v3.0开始, Singularity原生提供了对 <code class="docutils literal notranslate"><span class="pre">cgroups</span></code> 的支持，
允许使用Singularity命令限制容器的资源而不需要使用调度器（SLURM，PBS等）。
这个功能可以帮助防止DoS攻击：当一个容器获取所有可用的操作系统资源，这样其它容器就不能使用。
使用这个功能，用户需要首先创建cgroups配置文件，singularity默认安装的时候自带了一个例子配置文件，容器运行时，
设置 <code class="docutils literal notranslate"><span class="pre">--apply-cgroups</span></code> 为配置文件的路径，就可以应用cgroups的配置。更多关于cgroups的支持，请参考 <a class="reference external" href="https://sylabs.io/guides/3.5/admin-guide/configfiles.html#cgroups-toml">这里</a>。</p>
</div>
<div class="section" id="id4">
<h3><code class="docutils literal notranslate"><span class="pre">--security</span></code> 选项<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
<p>当运行容器的时候，Singularity提供了很多方法来修改安全范围和上下文。
这个选项可以应用到 <code class="docutils literal notranslate"><span class="pre">shell</span></code>, <code class="docutils literal notranslate"><span class="pre">exec</span></code>,  <code class="docutils literal notranslate"><span class="pre">run</span></code> 等命令上。更多信息参考 <a class="reference external" href="https://sylabs.io/guides/3.5/user-guide/security_options.html">这里</a>。</p>
</div>
</div>
<div class="section" id="sylabs-cloud">
<h2>Sylabs Cloud的安全性<a class="headerlink" href="#sylabs-cloud" title="Permalink to this headline">¶</a></h2>
<p><a class="reference external" href="https://cloud.sylabs.io/home">Sylabs Cloud</a> 包含一个 Remote
Builder, 一个Container Library, 和一个 Keystore。这些服务在一起提供了安全可信的打包和发布容器的方案。</p>
<div class="section" id="remote-builder">
<h3>Remote Builder<a class="headerlink" href="#remote-builder" title="Permalink to this headline">¶</a></h3>
<p>我们以前提到过，在一个共享资源的host上，用户一般不可能有root权限，而build容器的时候通常需要一些root权限。
这时候用户可以通过 <a class="reference external" href="https://cloud.sylabs.io/builder">Build Service</a> 远程build容器。
系统管理员可以监控到哪些用户正在build容器，以及容器的内容。
Singularity从3.0开始提供了原生的命令支持使用Build Service来远程build容器。
另外也可以通过浏览器访问Build Service来使用它build容器。</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>在HPC的多租户环境下，管理员通过 <a class="reference internal" href="fakeroot.html#fakeroot"><span class="std std-ref">Fakeroot</span></a> 也可以赋予一个用户在容器中特殊的权限。
Fakeroot有一些限制, 需要host kernel支持无特权的用户namespace。</p>
</div>
</div>
<div class="section" id="container-library">
<h3>Container Library<a class="headerlink" href="#container-library" title="Permalink to this headline">¶</a></h3>
<p><a class="reference external" href="https://cloud.sylabs.io/library">Container Library</a> 用来存储和共享用户的
Singularity Image Format (SIF)容器。通过web浏览器，用户可以访问Container Library，在上面定义projects，编辑容器对应的文档，查询其他人发布的容器。</p>
</div>
<div class="section" id="key-store">
<span id="keystore"></span><h3>Key Store<a class="headerlink" href="#key-store" title="Permalink to this headline">¶</a></h3>
<p><a class="reference external" href="https://cloud.sylabs.io/keystore">Key Store</a> 是Sylabs提供的key管理系统。
Key Store使用OpenPGP来共享和发现PGP的public key，使用public key可以验证容器。
这个服务基于OpenPGP的 HTTP Keyserver Protocol (HKP), 同时有一些增强:</p>
<ul class="simple">
<li><p>连接使用 Transport Layer Security (TLS)加密。</p></li>
<li><p>连接使用基于token的认证，只允许认证的用户添加和修改PGP keys。</p></li>
<li><p>提供web页面允许用户使用使用浏览器查看和查询PGP keys。</p></li>
</ul>
</div>
<div class="section" id="authenticationencryption">
<h3>Authentication和encryption<a class="headerlink" href="#authenticationencryption" title="Permalink to this headline">¶</a></h3>
<ol class="arabic simple">
<li><p>连接通过TLS保证了传输内容的安全。</p></li>
<li><p>服务之间支持通过加密的Token认证。</p></li>
<li><p>服务之间没有隐含的信任关系。每个服务之间的请求都是通过用户请求中带的Token认证。</p></li>
</ol>
</div>
</div>
</div>


           </div>
           
          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="build_a_container.html" class="btn btn-neutral float-right" title="Build容器" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="quick_start.html" class="btn btn-neutral float-left" title="入门教程" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 2017-2019, Sylabs Inc

    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 

</footer>

        </div>
      </div>

    </section>

  </div>
  


  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>